/**
 *	@file	safari_sv.h
 *	@brief	サファリセーブデータヘッダ
 *	@author	Miyuki Iwasawa
 *	@date	08.03.13
 */

#ifndef __H_SAFARI_SV_H__
#define __H_SAFARI_SV_H__

#include "savedata/playtime.h"
#include "savedata/mystatus.h"

///サファリレイアウト数max
typedef enum{
	SAFARI_LAYOUT_MINE,
	SAFARI_LAYOUT_FRIEND,
	SAFARI_LAYOUT_MAX,
	SAFARI_LAYOUT_GAME,	///<セーブされているモードのレイアウトを取得するための仮想ID
}SAFARI_LAYOUT_ID;

///サファリレイアウトブロックデータ数
#define SAFARI_FIELD_X		(3)
#define SAFARI_FIELD_Y		(2)
#define SAFARIL_BLOCK_MAX	(6)

///サファリ　配置マップ数max
#define SAFARI_MAP_MAX		(12)

///サファリ　配置オブジェ数max
#define SAFARI_OBJ_MAX	(30)

///サファリ　イベントキープレイタイム(分単位)MAX値定義
#define SAFARI_EVKEY_TIME_MAX	(999*60+59)

///サファリともだちデータ消去時間
#define SAFARI_DELETEDATA_HOUR		(60*60*24)	// 60秒×60分×24時間


///サファリレイアウトブロックID
typedef enum{
	SAFARI_BLOCK_00_00,
	SAFARI_BLOCK_01_00,
	SAFARI_BLOCK_02_00,
	SAFARI_BLOCK_00_01,
	SAFARI_BLOCK_01_01,
	SAFARI_BLOCK_02_01,
	SAFARI_BLOCK_MAX,
}SAFARI_BLOCK_ID;

//サファリオブジェID定義
typedef enum{
 SAFARI_OBJ_BUSH,		///<植え込み
 SAFARI_OBJ_FLOWER_R,	///<赤い花
 SAFARI_OBJ_FLOWER_W,	///<白い花
 SAFARI_OBJ_TREE,		///<木
 SAFARI_OBJ_STUMP,		///<切り株
 SAFARI_OBJ_BRANCH,		///<枝
 SAFARI_OBJ_ROCK_S,		///<小さな岩
 SAFARI_OBJ_ROCK_L,		///<大きな岩
 SAFARI_OBJ_ROCK_MOSS,	///<苔の岩
 SAFARI_OBJ_PUDDLE,		///<みずたまり
 SAFARI_OBJ_FOUNTAIN,	///<噴水
 SAFARI_OBJ_WATER_HOLE,	///<水飲み場
 SAFARI_OBJ_BENCH,		///<ベンチ
 SAFARI_OBJ_FANCE_SS,	///<短い柵横
 SAFARI_OBJ_FANCE_LS,	///<短い柵縦
 SAFARI_OBJ_FANCE_SL,	///<長い柵横
 SAFARI_OBJ_FANCE_LL,	///<長い柵縦
 SAFARI_OBJ_SIGNB,		///<看板
 SAFARI_OBJ_STATUE,		///<自分の像
 SAFARI_OBJ_FLAG,		///<自分の旗
 SAFARI_OBJ_LIGHT,		///<街灯
 SAFARI_OBJ_GUIDE_R,	///<道しるべ右
 SAFARI_OBJ_GUIDE_L,	///<道しるべ左
 SAFARI_OBJ_TRASHBOX,	///<ゴミ箱
 SAFARI_OBJ_ID_MAX,
}SAFARI_OBJ_ID;

//サファリ地形ID定義
typedef enum{
 SAFARI_MAP_PLANE,		//00 草原
 SAFARI_MAP_FLOWER,		//01 花畑
 SAFARI_MAP_SAVANNA,	//02 サバンナ
 SAFARI_MAP_ROCKY,		//03 岩場
 SAFARI_MAP_ROCKY_W,	//04 水辺の岩場
 SAFARI_MAP_DAMP,		//05 湿原
 SAFARI_MAP_FOREST,		//06 森
 SAFARI_MAP_FOREST_W,	//07 水辺の森
 SAFARI_MAP_BOGGY,		//08 沼地
 SAFARI_MAP_BARREN,		//09 荒地
 SAFARI_MAP_MOUNTAIN,	//10　山
 SAFARI_MAP_DESERT,		//11 砂漠
 SAFARI_MAP_ID_MAX,		//12
}SAFARI_MAP_ID;

///サファリブロック　配置オブジェデータ
typedef struct _SAFARI_OBJ{
	u8	id;
	u8	x,y,z;
}SAFARI_OBJ;

///サファリブロックレイアウトデータ
typedef struct _SAFARI_BLOCK{
	u8	map_id;
	u8	obj_ct;
	SAFARI_OBJ	obj[SAFARI_OBJ_MAX];
}SAFARI_BLOCK;


///サファリレイアウトセーブデータ公開型
typedef struct _SAFARI_LAYOUT{
	SAFARI_BLOCK	block[SAFARI_BLOCK_MAX];
	u8				map_level[SAFARI_MAP_MAX];
}SAFARI_LAYOUT;

//------------------------------------------------------------
/**
 * @brief サファリセーブデータブロック管理構造への不完全型ポインタ
 *
 * 中身は見えないけどポインタ経由で参照はできる
 */
//------------------------------------------------------------
typedef struct _SAFARI_SAVE	SAFARI_SAVE;

/**
 *	@brief	サファリセーブデータサイズ取得
 */
extern int SafariSv_GetWorkSize(void);

/**
 *	@brief	サファリデータブロックへのポインタを取得
 */
extern SAFARI_SAVE* SaveData_GetSafariSave(SAVEDATA* sv);

/**
 *	@brief	サファリデータ　初期データ
 */
extern void SafariSv_Init(SAFARI_SAVE* sv);

/**
 *	@brief	サファリのレイアウトデータ初期化
 *
 *	トレーナーIDに応じて、初期パターンが決まる
 */
extern void SafariSv_MyLayoutInit(SAFARI_SAVE* sv,u32 tr_id);

/**
 *	@brief	サファリゲーム中に参照するレイアウトIDを保存
 */
extern void SafariSv_SetGameLayoutID(SAFARI_SAVE* sv,SAFARI_LAYOUT_ID id);

/**
 *	@brief	サファリゲーム中に参照するレイアウトIDの取得
 */
extern SAFARI_LAYOUT_ID SafariSv_GetGameLayoutID(SAFARI_SAVE* sv);

/**
 *	@brief	サファリレイアウトデータポインタ　取得
 *
 *	＊構造体型のワークにコピー
 */
extern SAFARI_LAYOUT* SafariSv_GetLayoutPointer(SAFARI_SAVE* sv,SAFARI_LAYOUT_ID id);

/**
 *	@brief	サファリレイアウトデータ　取得
 *
 *	＊構造体型のワークにコピー
 */
extern void SafariSv_GetLayout(SAFARI_SAVE* sv,SAFARI_LAYOUT_ID id,SAFARI_LAYOUT* pl);

/**
 *	@brief	サファリレイアウトデータセット
 *
 *	＊構造体型で受け取ってコピー
 */
extern void SafariSv_SetLayout(SAFARI_SAVE* sv,SAFARI_LAYOUT_ID id,const SAFARI_LAYOUT* pl);

/**
 *	@brief	サファリレイアウト　レベルアップ遅延カウントを設定
 */
extern void SafariSv_SetLayoutLevelUpDelayCount(SAFARI_SAVE* sv,u8 delay_ct);

/**
 *	@brief	サファリレイアウト　レベルアップ遅延カウントを取得
 */
extern u8 SafariSv_GetLayoutLevelUpDelayCount(SAFARI_SAVE* sv);

/*
 *	@brief	サファリレイアウト　レベルアップ(日付更新処理で一日一回だけ呼び出す)
 *
 *	更新するのは自分のレイアウトだけ
 */
extern void SafariSv_LayoutLevelUp(SAFARI_SAVE* sv,s32 diff_days);

/**
 *	@brief	サファリ　OBJレベルの取得
 */
extern u8 SafariSv_GetObjLevel(SAFARI_SAVE* sv);

/*
 *	@brief	サファリ OBJレベルアップ
 */
extern u8 SafariSv_ObjLevelUp(SAFARI_SAVE* sv,u8 up_level);

/**
 *	@brief	サファリ OBJレベルセット
 */
extern void SafariSv_ObjLevelSet(SAFARI_SAVE* sv,u8 level);

/*
 *	@brief	サファリ　イベントキータイム設定
 */
extern void SafariSv_SetEventKeyTime(SAFARI_SAVE* sv,const PLAYTIME* time);

/**
 *	@brief サファリ　イベントキータイムチェック
 *	指定した時間分の差分があるかどうか？
 *
 *	@retval	0	達していない
 *	@retval	1	達した
 *	@retval	2	カンストにより達しない
 */
extern u8 SafariSv_CheckEventKeyTime(SAFARI_SAVE* sv,const PLAYTIME* time,u8 diff_hour);

/**
 *	@brief	サファリ マネージャーデータ(通信相手データ)セット
 */
extern void SafariSv_SetFriendStatus(SAFARI_SAVE* sv,const MYSTATUS* pFriend, int heapID);

/**
 *	@brief	サファリ マネージャーデータ(通信相手データ)ゲット
 */
extern void SafariSv_GetFriendStatus(const SAFARI_SAVE* sv,MYSTATUS* pFriend);

/**
 *	@brief	友だちサファリ　通信相手の性別を取得
 */
extern u8 SafariSave_GetFriendSex(const SAFARI_SAVE* sv);

/**
 *	@brief	サファリ マネージャーデータ(通信相手データ)があるのかどうか
 */
extern BOOL SafariSv_IsEnableData(const SAFARI_SAVE* sv);

/**
 *	@brief	サファリ マネージャーデータ(通信相手データ)を無効にするかどうか内部検査
 */
extern void SafariSv_CheckManagerData(SAFARI_SAVE* sv);

////////////////////////////////////////////////////////////////
//レイアウト
/**
 *	@brif	サファリレイアウト　ブロックデータスワップ
 */
extern void SafariLayout_BlockSwap(SAFARI_LAYOUT* layout,u8 pos1,u8 pos2);

/**
 *	@brief	サファリレイアウト　ブロックリプレース
 */
extern void SafariLayout_BlockReplace(SAFARI_LAYOUT* layout,SAFARI_BLOCK_ID block_id,SAFARI_MAP_ID map_id);

/*
 *	@brief	サファリレイアウト　オブジェ配置追加
 */
extern void SafariLayout_AddObj(SAFARI_LAYOUT* layout,SAFARI_BLOCK_ID block_id,SAFARI_OBJ* obj);

/*
 *	@brief	サファリレイアウト　オブジェ配置削除
 */
extern void SafariLayout_DelObj(SAFARI_LAYOUT* layout,SAFARI_BLOCK_ID block_id,u8 idx);

/***/
#endif	//__H_SAFARI_SV_H__